<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <!-- 
    什么是闭包：闭包指有权访问另一个函数作用域中变量的函数
    闭包的主要作用：延伸了变量的作用范围

    主要应用于节流防抖
    1.缺点
      函数执行完后，函数内部的局部变量没有释放，占用内存时间会变长
      容易造成内存泄漏
   -->
   <script>
     // 测试一    这里面没有闭包 因为内部函数没有引用外部函数的变量
     var name = "The Window"
        var object = {
            name:"My Object",
            getNameFunc:function(){
                return function(){
                    // 这里的this是window，因为这个函数是通过window调用的，上一个函数才是object调用的
                    return this.name
                }
            }
        }
        console.log(object.getNameFunc()())  //The Window

        // 测试二   是闭包
        var name = "The Window"
        var object = {
            name:"My Object",
            getNameFunc:function(){
                // 这里的this是object，因为这个函数是通过object调用的
                var that = this
                return function(){
                    return that.name
                }
            }
        }
        console.log(object.getNameFunc()()) //My object
        console.log("-----------------")

        // 超难的测试三
        function fun(n,o){
            console.log(o)
            return {
                fun:function(m){
                    return fun(m,n)
                }
            }
        }
        var a = fun(0); a.fun(1);  a.fun(2);  a.fun(3);//undefined 0  0 0
        var b = fun(0).fun(1).fun(2).fun(3);//undefined 0 1 2
        var c = fun(0).fun(1); c.fun(2);c.fun(3);//undefined 0, 1 , 1
   </script>
</body>
</html>